/**
 * 上海中赢金融信息服务有限公司
 * Copyright (c) 2016-2026 hmc,Inc.All Rights Reserved.
 */
package com.sys.midware.MQ.rocketMQ.config;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;

import com.sys.midware.assist.utils.string.StringUtil;
import com.sys.midware.config.core.ConfigContainer;
import com.sys.midware.config.core.ConfigKey;

/**
 * 
 * <b>ClassName：</b> ConfigRocketUtil <br/>
 * <b>Description：</b> 获取配置信息工具类 <br/>
 * <b>@author：</b> mobing <br/>
 * <b>@date：</b> 2015年10月19日 下午2:55:02 <br/>
 * <b>@version: </b>  <br/>
 */
public class ConfigRocketUtil {
    private static final String DEFAULT_MQ_INS_PRODUCER= "INS-B-PRODUCER";
    
    private static final String DEFAULT_MQ_INS_CONSUMER= "INS-B-CONSUMER";
    //默认生产
    private static final String DEFAULT_MQ_GROUP_PRODUCER= "GROUP-B-MQ";
    
    private static final String DEFAULT_MQ_GROUP_CONSUMER= "GROUP-B-MQ";
    
    private static final String DEFAULT_MQ_TAG= "*";

    /**
     * ConfigContainer instance
     */
    private static ConfigContainer cfg = ConfigContainer.getInstance(ConfigKey.ConfigFile.CONFIG_FILE_ROOT);

    /**
     * 获取 Rocketmq name server
     * 
     * @return String
     */
    public static String getRocketNameServer() {
        return cfg.getParamString(MQConfigKey.KEY_ROCKETMQ_NAME_SERVER);
    }

    /**
     * 获取生产者默认组
     * 
     * @return String
     */
    public static String getMQGroupProducer() {
        String groupStr = cfg.getParamString(MQConfigKey.KEY_MSG_GROUP_PRODUCER);
        //如果配置未传，则走默认
        if(StringUtil.isEmpty(groupStr)){
            groupStr = DEFAULT_MQ_GROUP_PRODUCER;
        }
       
        return groupStr;
    }
    
    /**
     * 获取生产者实例
     * 
     * @return String
     */
    public static String getMQInstanceProducer() {
        String groupStr = cfg.getParamString(MQConfigKey.KEY_MSG_INSTANCE_PRODUCER);
        //如果配置未传，则走默认
        if(StringUtil.isEmpty(groupStr)){
            groupStr = DEFAULT_MQ_INS_PRODUCER;
        }
       
        return groupStr;
    }
    
    /**
     * 获取消费者默认组
     * 
     * @return String
     */
    public static String getMQGroupConsumer() {

        String groupStr = cfg.getParamString(MQConfigKey.KEY_MSG_GROUP_CONSUMER);
        //如果配置未传，则走默认
        if(StringUtil.isEmpty(groupStr)){
            groupStr = DEFAULT_MQ_GROUP_CONSUMER;
        }
        return groupStr;
    }
    
    /**
     * 获取消费者实例名
     * 
     * @return String
     */
    public static String getMQInstanceConsumer() {

        String groupStr = cfg.getParamString(MQConfigKey.KEY_MSG_INSTANCE_CONSUMER);
        //如果配置未传，则走默认
        if(StringUtil.isEmpty(groupStr)){
            groupStr = DEFAULT_MQ_INS_CONSUMER;
        }
        return groupStr;
    }

    /**
     * 消费消息线程，最小数目
     * 
     * @return int 默认值 20
     */
    public static int getMsgConsumerThreadMinSize() {
        String threadMinSize = cfg.getParamString(MQConfigKey.KEY_MSG_CONSUMER_THREAD_MIN_SIZE);

        if (StringUtils.isBlank(threadMinSize) || !NumberUtils.isDigits(threadMinSize)) {
            return 20;
        }
        return Integer.parseInt(threadMinSize);
    }

    /**
     * 消费消息线程，最大数目
     * 
     * @return int 默认值 40
     */
    public static int getMsgConsumerThreadMaxSize() {

        String threadMaxSize = cfg.getParamString(MQConfigKey.KEY_MSG_CONSUMER_THREAD_MAX_SIZE);

        if (StringUtils.isBlank(threadMaxSize) || !NumberUtils.isDigits(threadMaxSize)) {
            return 40;
        }
        return Integer.parseInt(threadMaxSize);
    }

    /**
     * 本地队列消息数超过此阀值，开始流控
     * 
     * @return int 默认值 1000
     */
    public static int getMsgPullThresholdQueueSize() {

        String thresholdQueueSize = cfg.getParamString(MQConfigKey.KEY_MSG_PULL_THRESHOLD_QUEUE_SIZE);

        if (StringUtils.isBlank(thresholdQueueSize) || !NumberUtils.isDigits(thresholdQueueSize)) {
            return 1000;
        }
        return Integer.parseInt(thresholdQueueSize);
    }

    /**
     * 一次消费最大数,即每次消费,如果是多个则消费时是一个数组，但带来的问题是如果一个成功一个失败，返回值就不好弄了
     * 
     * @return int 默认值 1
     */
    public static int getMsgConsumerBatchMaxSize() {

        String batchConsumerSize = cfg.getParamString(MQConfigKey.KEY_MSG_PULL_BATCH_SIZE);

        if (StringUtils.isBlank(batchConsumerSize) || !NumberUtils.isDigits(batchConsumerSize)) {
            return 1;
        }
        return Integer.parseInt(batchConsumerSize);
    }

    /**
     * 从服务器，一次拉取消息数
     * 
     * @return int 默认值 32
     */
    public static int getMsgPullBatchSize() {

        String pullBatchConsumerSize = cfg.getParamString(MQConfigKey.KEY_MSG_PULL_BATCH_SIZE);

        if (StringUtils.isBlank(pullBatchConsumerSize) || !NumberUtils.isDigits(pullBatchConsumerSize)) {
            return 32;
        }
        return Integer.parseInt(pullBatchConsumerSize);
    }

    /**
     * 同一队列并行消费的最大跨度，顺序消费方式情况下，此参数无效,作用与流量控制
     * 
     * @return int 默认值 2000
     */
    public static int getConcurrentlyMaxSpanSize() {

        String concurrentlyMaxSpanSize =cfg.getParamString(MQConfigKey.KEY_MSG_CONSUME_CONCURRENTLY_MAX_SPAN_SIZE);

        if (StringUtils.isBlank(concurrentlyMaxSpanSize) || !NumberUtils.isDigits(concurrentlyMaxSpanSize)) {
            return 2000;
        }
        return Integer.parseInt(concurrentlyMaxSpanSize);
    }
    
    /**
     * 获取默认订阅的topic配置
     * 
     * @return List<String>
     */
    public static List<String> getSubscribeTopicList() {
        String topicStr = cfg.getParamString(MQConfigKey.KEY_MSG_SUBSCRIBE_TOPIC);
        if (StringUtil.isEmpty(topicStr)) {
            return Collections.emptyList();
        }
        return Arrays.asList(topicStr.split(","));
    }
    /**
     * 获取默认消息队列topic
     * 
     * @return List<String>
     */
    public static String getSubscribeTopic() {
        String topic = cfg.getParamString(MQConfigKey.KEY_MSG_SUBSCRIBE_TOPIC);
        return topic;
    }
    
    /**
     * 获取默认消息队列TAG
     * 
     * @return List<String>
     */
    public static String getMsgTag() {
        String tagStr = cfg.getParamString(MQConfigKey.KEY_MSG_TAGS);
        if (StringUtil.isEmpty(tagStr)) {
            return DEFAULT_MQ_TAG;
        }
        return tagStr;
    }
    
    /**
     * 获取默认消息队列key
     * 
     * @return List<String>
     */
    public static String getMsgKey() {
        String keyStr = cfg.getParamString(MQConfigKey.KEY_MSG_KEYS);
        return keyStr;
    }
    
   
    
}
